package com.mdjnu.service.imp;

import com.mdjnu.mapper.UserMapper;
import com.mdjnu.pojo.Result;
import com.mdjnu.pojo.User;
import com.mdjnu.service.UserService;
import com.mdjnu.until.JwtUntil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
@SuppressWarnings("all")
@Service
public class UserServiceImp implements UserService {
    // 用户Mapper
    @Autowired
    private UserMapper userMapper;
    // Redis
    @Autowired
    private RedisTemplate redisTemplate;
    // 邮件发送者
    @Autowired
    private JavaMailSender javaMailSender;
    // 发件人邮箱
    @Value("${spring.mail.username}")
    private String fromEmail;
    // Jwt工具
    @Autowired
    private JwtUntil jwtUntil;
    /**
     * 根据email和密码查询用户
     * @param email email
     * @param password 密码
     * @return 被查询用户信息
     */
    @Override
    public User findByEmailAndPassword(String email, String password) {
        // 根据email和密码查询用户
        User user = userMapper.findByEmailAndPassword(email, password);
        //  返回用户信息: 如果用户存在，则返回用户信息，否则返回null
        if (user != null) {
            // 生成token
            String token =jwtUntil.getSecrerKey("email",email);
            // 将token保存到用户信息中
            user.setPasswordHash(token);
            return user;
        }else {
            return null;
        }
    }
    /**
     * 发送邮件
     * @param email 邮箱
     */
    @Override
    public void sendCode(String email) {
        // 1.生成随机6位数字验证码
        String code = (int)((Math.random()*9+1)*100000) + "";
        // 2.创建邮件
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(fromEmail);
        message.setTo(email);
        message.setSubject("验证码");
        message.setText("您的验证码为：" + code +  "，请勿泄露给其他人。验证码有效时间:2分钟");
        // 3.将验证码保存到redis中，有效时间2分钟
        redisTemplate.opsForValue().set(email, code, 2 * 60,  java.util.concurrent.TimeUnit.SECONDS);
        // 4.发送邮件
        javaMailSender.send(message);
    }
    /**
     * 根据email登录
     * @param email 邮箱
     * @param code 验证码
     * @return 被查询用户信息
     */
    @Override
    public User loginByEmail(String email,String code) {
        // 判断用户是否存在
        if (userMapper.findByEmail(email) == null) {
            return null;
        }
        // 1. 从redis 判断是否有验证码
        if (redisTemplate.hasKey(email)) {
            // 2. 获取redis中的验证码
            String redisCode = (String) redisTemplate.opsForValue().get(email);
            // 3. 比较验证码
            if (code.equals(redisCode)) {
                // 4. 验证码正确，删除redis中的验证码
                redisTemplate.delete(email);
                // 5. 根据email查询用户
                User user = userMapper.findByEmail(email);
                // 6. 生成token
                String token = jwtUntil.getSecrerKey("email",email);
                // 7. 将token保存到用户信息中
                user.setPasswordHash(token);
                return user;
            }
        }
        return null;
    }

    @Override
    public Result loginByToken(String token) {
        if (jwtUntil.verify(token)) {
            // 1. 从token中获取email
            String email = jwtUntil.decodeToken(token).get("email").asString();
            // 2. 根据email查询用户
            User user = userMapper.findByEmail(email);
            // 3. 判断用户是否存在
            if (user != null){
                user.setPasswordHash(null);
                return Result.success(user);
            }
            else {
                return Result.error("token错误,请重新登录");
            }
        }
        return Result.error("token过期或失效");//  返回结果
    }

    @Override//根据id查询用户信息
    public Result getUserByIds(int[] userId)
    {
        return Result.success(userMapper.findByFollowId(userId));// 返回结果
    }
}
